package com.atguigu.lease.web.admin.service.impl;

import com.atguigu.lease.model.entity.FeeKey;
import com.atguigu.lease.model.entity.FeeValue;
import com.atguigu.lease.web.admin.mapper.FeeKeyMapper;
import com.atguigu.lease.web.admin.mapper.FeeValueMapper;
import com.atguigu.lease.web.admin.service.FeeKeyService;
import com.atguigu.lease.web.admin.service.FeeValueService;
import com.atguigu.lease.web.admin.vo.fee.FeeKeyVo;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;
import java.util.stream.Collectors;

/**
 * @author liubo
 * @description 针对表【fee_key(杂项费用名称表)】的数据库操作Service实现
 * @createDate 2023-07-24 15:48:00
 */
@Service
public class FeeKeyServiceImpl extends ServiceImpl<FeeKeyMapper, FeeKey>
        implements FeeKeyService {

    @Autowired
    private FeeValueMapper feeValueMapper;

    // 三种方法实现 java代码 表连接 分布查询
    @Override
    public List<FeeKeyVo> getFeeKeyVoList() {

        // FeeKeyVo =  FeeKey + List<FeeValue>
        // 方法一: java 代码实现

        // 查询所有  feeKey

        List<FeeKey> feeKeyList = baseMapper.selectList(null);

        // 流式操作 map 里需要一个功能行函数，有输入 k 有返回值 map里面就是处理过程 collect 结束流的操作，返回处理好的集合
        // 原本函数 feeKeyList.stream().map((FeeKey k)->{return null;}).collect(Collectors.toList());
        return feeKeyList.stream().map(k -> {

            // 里面对 feeValue 进行筛选   1、可以装配一个 feeValueMapper 或 feeValueService
            //                           2、或者自己写一个查询的方法---sql语句查出来

            List<FeeValue> feeValueList = feeValueMapper.selectList(new LambdaQueryWrapper<FeeValue>().eq(FeeValue::getFeeKeyId, k.getId()));

            // 两者都查到后 我们需要得到一个 FeekeyVo ，需要 new 一个出来后再进行属性复制

            FeeKeyVo feeKeyVo = new FeeKeyVo();

            // BeanUtils.copyProperties 是 Apache Commons BeanUtils 库中提供的一个方法，用于将一个 JavaBean
            // 的属性复制到另一个 JavaBean 中。这个方法非常实用，特别是在需要将一个对象的属性值复制到另一个对象时，可以避免手动设置每个属性。
            // k 是源对象，其属性值将被复制。
            //  feeKeyVo 是目标对象，它将接收来自 k 的属性值。
            BeanUtils.copyProperties(k, feeKeyVo);

            feeKeyVo.setFeeValueList(feeValueList);

            return feeKeyVo;

        }).collect(Collectors.toList());


    }

    @Override
    public List<FeeKeyVo> getFeeKeyVoList1() {
        return baseMapper.getFeeKeyVoList1();
    }

    @Override
    public List<FeeKeyVo> getFeeKeyVoList2() {
        return baseMapper.getFeeKeyVoList2();
    }
}




